package com.rem.springboot2.config;

import com.rem.springboot2.pojo.Pet;
import com.rem.springboot2.pojo.User;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 容器组件 注解解释：
 * -    @Bean：给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值，就是组件在容器中的实例
 * -    @Configuration((proxyBeanMethods = false))：告诉SpringBoot这是一个配置类 == 配置文件， proxyBeanMethods：代理bean的方法 默认true
 * -                     Full(proxyBeanMethods = true)【保证每个@Bean方法被调用多少次返回的组件都是单实例的】
 * -                     Lite(proxyBeanMethods = false)【每个@Bean方法被调用多少次返回的组件都是新创建的】
 * -                     组件依赖必须使用Full模式默认。其他默认是否Lite模式
 * <p>
 * -@Import  给容器中自动创建出这两个类型的组件、默认组件的名字就是全类名
 * -@ImportResource  给容器中导入原生配置文件
 * -@ConfigurationProperties  在配置文件中配置的bean可以映射到实体类中 但是要加@Component 放入容器中
 * -@EnableConfigurationProperties  可以让@ConfigurationProperties 配置的实体类不用加@Component 而通过配置类的方式多个配置
 * -@Conditional    @ConditionalOnBean 条件注解 当某个条件成立的时候在创建bean
 *
 * @author Rem
 * @date 2021-03-18
 */

//@EnableConfigurationProperties(Car.class)
//@Import({User.class, DBHelper.class})
//@ImportResource("classpath:beans.xml")
@Configuration
public class MyConfig {

    @Bean("tom")
    public Pet tomcat() {
        return new Pet("tomcat");
    }


    @ConditionalOnBean(Pet.class) //(name = "tom")
    @Bean
    public User user01() {
        User zhangsan = new User("zhangsan", 18);
        //user组件依赖了Pet组件
        zhangsan.setPet(tomcat());
        return zhangsan;
    }





}
